iT邦幫忙

3

以Postgresql為主,再聊聊資料庫 利用自定義型態 create type 建立 typed table

  • 分享至 

  • xImage
  •  

先來看一張圖
https://ithelp.ithome.com.tw/upload/images/20220210/20050647lsTkSwWwMU.png

簡單說明一下裡面的指令:

  1. 先建立一個 table 名稱鮭魚壽司,裡面有兩個欄位,蘋果跟草莓,型態是 int 及 text.
  2. 建立 type 辣椒 , 裡面的欄位是小螃蟹,根據 鮭魚壽司table,所以小螃蟹是複合資料型態,裡面就包含了蘋果跟草莓.
  3. 再來利用 type 辣椒 來建立 typed table 芒果.
  4. 接著就是輸入資料,這時候需要使用轉型的技巧,PG可以使用 :: 運算符號,與CAST()等效.
  5. 接著是取出資料,因為是複合資料型態,所以需要用()包住小螃蟹.

看到這裡,也許會有疑問.這種 typed table 有何用處?
先來看
https://ithelp.ithome.com.tw/upload/images/20220210/20050647Q6Bkt5rgIF.png
當我們要對辣椒增加屬性時,因為有 typed table 的關係,是不能這樣修改,要用 CASCADE.
有點類似關聯限制.
接著我們使用辣椒再建立一個table 西瓜.
然後再增加辣椒的屬性.
https://ithelp.ithome.com.tw/upload/images/20220210/200506474iTziT15TH.png

後面再做查詢,可以看到table的欄位是 小螃蟹 與 奇異果.
這樣的關係限制,有利於我們在系統中,保持欄位的一致性.就不會改了芒果忘了西瓜.

在PG的information_schema.tables 裡面也有 is_typed 屬性.
可以很方便的查到,哪些table 是 typed table.

線上展示在以下連結:
https://dbfiddle.uk/?rdbms=postgres_14&fiddle=dbc11dbbebce4e65f02dd32ace903da9

編輯時預覽,可以看到 辣椒 那些 emoji.但是發表時,卻又變成?了,所以改成截圖方式.


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
尼克
iT邦大師 1 級 ‧ 2022-02-10 10:32:57

這是黑科技嗎?

看更多先前的回應...收起先前的回應...

IBM DB2 也有 typed table
https://www.ibm.com/docs/en/db2/11.5?topic=tables-creating-typed
Oracle 也有自定義type 與 繼承
https://docs.oracle.com/en/database/oracle/oracle-database/18/adobj/inheritance-in-sql-object-types.html#GUID-381EB31A-F88A-478E-9430-E2D88E844A8D

PG 也有table 繼承,這個以後會分享.

三者的這些機制不完全相同,比較像是各自奔放的發展.

尼克 iT邦大師 1 級 ‧ 2022-02-10 10:59:38 檢舉

感謝你!我另外注意到為何能將圖片顯示並做定義?

PG 支援 UNICODE 的程度很高,所以物件(table,column等等),都可以使用.所以就使用了emoji.

尼克 iT邦大師 1 級 ‧ 2022-02-10 13:05:44 檢舉

/images/emoticon/emoticon24.gif

我要留言

立即登入留言